/**
 * @Copyright 2012, Founder Mobile Media Technology（Chongqing） Co., Ltd L.P. All
 *            rights reserved. The information contained herein is confidential
 *            and proprietary to Founder Mobile Media Technology（Chongqing） Co.,
 *            Ltd, and considered a trade secret as defined under civil and
 *            criminal statutes. Founder Mobile Media Technology（Chongqing） Co.,
 *            Ltd shall pursue its civil and criminal remedies in the event of
 *            unauthorized use or misappropriation of its trade secrets. Use of
 *            this information by anyone other than authorized employees of
 *            Founder Mobile Media Technology（Chongqing） Co., Ltd is granted
 *            only under a written non-disclosure agreement, expressly
 *            prescribing the scope and manner of such use.
 */
package com.g2room.quartz.util;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.quartz.Scheduler;
import org.quartz.SchedulerException;

import com.g2room.quartz.engine.QuartzEngine1;

/**
 * Scheduler的相关操作工具类。<br>
 * 包括获取Schedule工厂内的所有Schedule，Schedule的名称及Schedule数量<br>
 * 对Schedule的启动\暂停\停止操作<br>
 * 
 * @createTime: May 30, 2013 11:08:11 PM
 * @author: <a href="mailto:gaoxg@FOUNDER.COM.CN">Xuguo Gao</a>
 * @version: 0.1
 * @lastVersion: 0.1
 * @updateTime: 
 * @updateAuthor: <a href="mailto:gaoxg@FOUNDER.COM.CN">Xuguo Gao</a>
 * @changesSum: 
 * 
 */
public class ScheduleUtil {
	
	/**
	 * 
	 * 获取任务调度工厂(SchedulerFactory)内的Schedule数量
	 *
	 * @return	SchedulerFactory内Schedule的数量，如为-1，则说明获取发生异常
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 24, 2013 2:31:36 PM
	 */
	public static int getSchedulerNum(){
		int result = -1;
		try {
			result = getSchedulers().size();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return result;
	}
	
	/**
	 * 
	 * 获取任务调度工厂（SchedulerFactory）的所有的Scheduler对象
	 *
	 * @return {Collection&#60;Scheduler&#62;} Scheduler对象集合
	 *
	 * @throws SchedulerException
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 24, 2013 2:31:52 PM
	 */
	public static Collection<Scheduler> getSchedulers() throws SchedulerException {
		return QuartzEngine1.getSchedulerFactory().getAllSchedulers();
	}
	
	/**
	 * 
	 * 获取任务调度工厂（SchedulerFactory）的所有的Scheduler对象名称
	 *
	 * @return {List&#60;String&#62;} Scheduler的名称List集合
	 *
	 * @throws SchedulerException
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 24, 2013 2:31:59 PM
	 */
	public static List<String> getSchedulerNames() throws SchedulerException {
		List<String> schedulerNameList = new ArrayList<String>();
		Collection<Scheduler> schedulers = getSchedulers();
		for(Scheduler scheduler : schedulers) {
			schedulerNameList.add(scheduler.getSchedulerName());
		}
		return schedulerNameList;
	}
	
	/**
	 * 
	 * 根据名字获取Scheduler
	 *
	 * @param {String} schedulerName 需要获取的Scheduler名称
	 * @return {Scheduler} 根据名称获取到的Scheduler对象
	 *
	 * @throws SchedulerException
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 24, 2013 2:32:09 PM
	 */
	public static Scheduler getSchedulerByName(String schedulerName) throws SchedulerException {
		return QuartzEngine1.getSchedulerFactory().getScheduler(schedulerName);
	}
	
	/**
	 * 
	 * 根据指定的Scheduler名称，获取Scheduler对象，并启动。
	 *
	 * @param {String} schedulerName Scheduler的名字
	 * @return {boolean} 成功启动，则返回true，<br>
	 * 未找到指定名称的Scheduler或启动失败则返回false
	 *
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jun 24, 2013 2:32:18 PM
	 */
	public static boolean startScheduler(String schedulerName) {
		boolean result = false;
		try {
			getSchedulerByName(schedulerName).start();
			result = true;
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return result;
	}
	
	/**
	 * 启动所有Scheduler对象。
	 *
	 * @return {List&#60;String&#62;} 失败启动的Scheduler的名称列表<br>
	 * 若返回null，则表明在获取所有的Scheduler的出现异常<br>
	 * 若返回的List的size=0，则表明所有的Scheduler都成功启动
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a>
	 * May 30, 2013 9:53:21 PM
	 */
	public static List<String> startScheduler() {
		List<String> failNames = null;
		try {
			failNames = startScheduler(getSchedulerNames());
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return failNames;
	}
	
	/**
	 * 启动指定的Scheduler对象。
	 *
	 * @param {List&#60;String&#62;} schedulerNames 需要启动Scheduler名称的List列表
	 * @return {List&#60;String&#62;} 失败启动的Scheduler的名称列表<br>
	 * 若返回的List的size=0，则表明所有的Scheduler都成功启动
	 * 
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a>
	 * May 30, 2013 11:39:09 PM
	 */
	public static List<String> startScheduler(List<String> schedulerNames) {
		List<String> failNames = schedulerNames;
		try {
			for(String schedulerName : schedulerNames) {
				getSchedulerByName(schedulerName).start();
				failNames.remove(schedulerName);
			}
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return failNames;
	}
	
	/**
	 * 根据指定的Scheduler名称，获取Scheduler对象，并暂停。
	 *
	 * @param {String} schedulerName Scheduler的名字
	 * @return {boolean} 成功暂停，则返回true，<br>
	 * 未找到指定名称的Scheduler或暂停失败则返回false
	 *
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a>
	 * May 30, 2013 10:23:21 PM
	 */
	public static boolean pauseScheduler(String schedulerName) {
		boolean result = false;
		try {
			getSchedulerByName(schedulerName).standby();
			result = true;
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return result;
	}
	
	/**
	 * 根据指定的Scheduler名称列表，获取Scheduler对象，并暂停。
	 *
	 * @param {List&#60;String&#62;} schedulerNames Scheduler的名字的List列表
	 * @return {List&#60;String&#62;} 失败暂停的Scheduler的名称列表<br>
	 * 若返回的List的size=0，则表明所有的Scheduler都成功暂停
	 *
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a>
	 * May 30, 2013 10:23:21 PM
	 */
	public static List<String> pauseScheduler(List<String> schedulerNames) {
		List<String> failNames = schedulerNames;
		try {
			for(String schedulerName : schedulerNames) {
				getSchedulerByName(schedulerName).standby();
				failNames.remove(schedulerName);
			}
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return failNames;
	}
	
	/**
	 * 获取所有Scheduler对象，并暂停。
	 *
	 * @return {List&#60;String&#62;} 失败暂停的Scheduler的名称列表<br>
	 * 若返回为null，则表明获取所有的Scheduler时发生异常<br>
	 * 若返回的List的size=0，则表明所有的Scheduler都成功暂停
	 *
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a>
	 * May 30, 2013 10:23:21 PM
	 */
	public static List<String> pauseScheduler() {
		List<String> failNames = null;
		try {
			failNames = pauseScheduler(getSchedulerNames());
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return failNames;
	}

	/**
	 * 立即停止Scheduler，此时不管是否有调度任务正在执行。
	 *
	 * @param {String} schedulerName Scheduler的名字
	 * @return {boolean} 成功停止，则返回true，<br>
	 * 未找到指定名称的Scheduler或停止失败则返回false
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a>
	 * May 30, 2013 10:26:13 PM
	 */
	public static boolean stopScheduler(String schedulerName) {
		boolean result = false;
		try {
			getSchedulerByName(schedulerName).shutdown();
			result = true;
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return result;
	}
	
	/**
	 * 根据指定的Scheduler名称列表，获取Scheduler对象，并停止。
	 *
	 * @param {List&#60;String&#62;} schedulerNames Scheduler的名字的List列表
	 * @return {List&#60;String&#62;} 失败停止的Scheduler的名称列表<br>
	 * 若返回的List的size=0，则表明所有的Scheduler都成功停止
	 *
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a>
	 * May 30, 2013 10:23:21 PM
	 */
	public static List<String> stopScheduler(List<String> schedulerNames) {
		List<String> failNames = schedulerNames;
		try {
			for(String schedulerName : schedulerNames) {
				getSchedulerByName(schedulerName).shutdown();
				failNames.remove(schedulerName);
			}
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return failNames;
	}
	
	/**
	 * 获取所有Scheduler对象，并停止。
	 *
	 * @return {List&#60;String&#62;} 失败停止的Scheduler的名称列表<br>
	 * 若返回为null，则表明获取所有的Scheduler时发生异常<br>
	 * 若返回的List的size=0，则表明所有的Scheduler都成功停止
	 *
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a>
	 * May 30, 2013 10:23:21 PM
	 */
	public static List<String> stopScheduler() {
		List<String> failNames = null;
		try {
			failNames = stopScheduler(getSchedulerNames());
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return failNames;
	}
	
	/**
	 * 
	 * 延迟停止Scheduler，此时需等待正在执行的任务完成后停止。
	 *
	 * @param {String} schedulerName Scheduler的名字
	 * @return {boolean} 成功停止，则返回true，<br>
	 * 未找到指定名称的Scheduler或停止失败则返回false
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a>
	 * May 30, 2013 10:29:37 PM
	 */
	public static boolean stopSchedulerDelay(String schedulerName) {
		boolean result = false;
		try {
			getSchedulerByName(schedulerName).shutdown(true);
			result = true;
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return result;
	}
	
	/**
	 * 根据指定的Scheduler名称列表，获取Scheduler对象，并延迟停止。
	 *
	 * @param {List&#60;String&#62;} schedulerNames Scheduler的名字的List列表
	 * @return {List&#60;String&#62;} 失败停止的Scheduler的名称列表<br>
	 * 若返回的List的size=0，则表明所有的Scheduler都成功停止
	 *
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a>
	 * May 30, 2013 10:23:21 PM
	 */
	public static List<String> stopSchedulerDelay(List<String> schedulerNames) {
		List<String> failNames = schedulerNames;
		try {
			for(String schedulerName : schedulerNames) {
				getSchedulerByName(schedulerName).shutdown(true);
				failNames.remove(schedulerName);
			}
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return failNames;
	}
	
	/**
	 * 获取所有Scheduler对象，并延迟停止。
	 *
	 * @return {List&#60;String&#62;} 失败停止的Scheduler的名称列表<br>
	 * 若返回为null，则表明获取所有的Scheduler时发生异常<br>
	 * 若返回的List的size=0，则表明所有的Scheduler都成功停止
	 *
	 * @auther <a href="mailto:gaoxg@FOUNDER.COM.CN">Gao Xuguo</a>
	 * May 30, 2013 10:23:21 PM
	 */
	public static List<String> stopSchedulerDelay() {
		List<String> failNames = null;
		try {
			failNames = stopSchedulerDelay(getSchedulerNames());
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return failNames;
	}
}
